#include <windows.h>
#include "connector/include/mysql.h"
#include <string>

using std::string;

#ifndef _bd_h
#define _bd_h
/* Glowne zrodlo kodu, szczegolowy opis wszystkiego co jest powiazane z mysql w C api
http://dev.mysql.com/doc/refman/5.0/en/c.html */

// uchwyty

MYSQL *mysql; // uchwyt do polaczenia z jedna baza danych jest uzywany przy prawie wszystkich mysql'owych funkcjach
MYSQL_RES *res; // uchwyt do struktury reprezentujacej wynik zapytania ktore zwraca wiersze
string tablica_pacjent[9]; // deklaracje tablic wynikowych
string tablica_choroba[5];
string tablica_daty[10];
string idchor[1];
int n;

inline bool polaczzbaza(MYSQL *& pol) // funkcja ktora ma za zadanie polaczenie z baza danych
{
    pol=mysql_init(NULL);
    /* mysql_init powinien przyjmowac w parametrze typ MYSQL ( do gory jest handler do tego ) tutaj przyjmuje
    wskaźnik NULL - wtedy zostaje przydzielony, inicjalizowany i zwrocony nowy obiekt. Obiekt jesy zwalniany po
    poleceniu mysql_close */

    if (!pol) // tutaj zwracamy komunikat ktory moze wystapic przed polaczeniem
    {
        MessageBox(
            NULL,
            mysql_error(mysql),
            "Blad",
            MB_ICONWARNING
        );
    }
    // deklaracje stalych char'ow - wykorzystywanych do polaczenia z baza przez mysql_real_connect
    const char *host = "sql09.freemysql.net";
    const char *user = "turbo88";
    const char *pass = "haslo123";
    const char *db   = "pacjent";

    if (!mysql_real_connect(pol, host, user, pass, db, 0, NULL, 0))
        /* mysql_real_connect - ustanawia stabilne polaczenie do bazy danych na wskazanym hoscie
        Parametry:
        1 - wskaznik na uchwyt polaczenia z baza danych
        2 - host - miejsce gdzie lezy baza danych
        3 - User
        4 - Pass
        5 - nazwa bazy danych
        6 - port bd
        7 - unix_socket
        8 - flaga klienta */
    {
        // kolejny komunikat z bledem polaczenia - tym razem juz po podlaczeniu do bd
        MessageBox(
            NULL,
            mysql_error(mysql),
            "Blad polaczenia!",
            MB_ICONWARNING
        );
        return false;
    }
    // testowy komunikat wyrzucajacy wersje serwera - wyswietla sie za kazdym razem kiedy wywolujemy funkcje
    /*  MessageBox(
          NULL,
          mysql_get_server_info(mysql),
          "WYWOLANO FUNKCJE",
          MB_ICONWARNING
      ); */
    return true;
}

inline string *pobierzdane(string pesel1)
// funkcja INLINE (http://klub.chip.pl/b.krzemien/c++-faq-pl/inline-functions.html#faq-9.5) pobiera dane
//pacjenta z tabeli pacjent w bazie danych
{
    if(!polaczzbaza(mysql)) // laczenie z baza danych
    {
        return NULL;
    }

    int zwrot;
    // zapytanie
    string z = "select p.imie, p.nazwisko,p.pesel,p.adres, p.uwagi,p.alergie,p.przewlekle,p.przebyte,p.obecnie from pacjent p where p.pesel ='" + pesel1 +"';";

    zwrot = mysql_query(mysql, z.c_str());
    /* Jezezli zwrot pryjmie wartosc 0 to znaczy ze zapytanie zostalo wykonane poprawnie, jezeli wynik bedzie
    rozny od 0 wyswietla sie MessageBox z kodem bledu.
    mysql_query - uruchamia zapytanie w bd, zwraca int
    1 - arg wskaznik na uchwyt polaczenia z baza danych
    2 - zapytanie constant char
    */
    if (zwrot != 0)
        MessageBox(NULL,mysql_error(mysql),"BLAD w zapytaniu pobierzdane",MB_OK);
    else
    {
        res = mysql_store_result(mysql); // musi byc uzyte jezeli wczesniej wywolujemy zapytanie ktore zwraca wynik. mysql_store_result odczytuje caly wynik zapytania do klienta, przypisuje go do MYSQL_RES
        if (res) // jezeli zwrocilo wynik
        {

            MYSQL_ROW row; // uchwyt do typu reprezentujacego jeden wiersz zapytania, zaimplementowany jako tablica byteStrings
            int liczba = mysql_num_fields(res); // funkcja zliczajaca pola ( samo MYSQL_FIELD przechowuje metadane zawierajace informacje o polu - jego nazwe, typ i pojemnosc
            while(row = mysql_fetch_row(res)) // fetch_row pobiera nastepny wiersz ze zbioru wynikow MYSQL_RES
            {
                for( int i = 0; i < liczba; i++) // przechodzi po row'ach i wrzuca wszystko w tablice
                {
                    tablica_pacjent[i] = row[i];
                }
            }
        }
    }
    mysql_close(mysql); // zamyka poprzednio otwarte polaczenie z BD.
    return tablica_pacjent;
}
/*
// ponizej dziala wszystko praktycznie tak samo jak pobierzdane()
inline string *pobierzdaty(string pesel2)
{
    if(!polaczzbaza(mysql))
    {
        return NULL;

    }
    int ret;

    string z = "select d.pierwsza, d.druga, d.trzecia, d.czwarta, d.piata, d.szosta, d.siodma, d.osma, d.dziewiata, d.dziesiata  from wizyty d where  d.peselw = '"+ pesel2 +"';";

    ret = mysql_query(mysql, z.c_str());
    if (ret != 0)
        MessageBox(NULL,mysql_error(mysql),":>",MB_OK);
    else
    {
        res = mysql_store_result(mysql);
        if (res)
        {

            MYSQL_ROW row;
            int liczba = mysql_num_fields(res);
            while(row = mysql_fetch_row(res))
            {
                for( int i = 0; i < liczba; i++)
                {
                    tablica_daty[i] = row[i];
                }
            }
        }
    }
    mysql_close(mysql);
    return tablica_daty;
}
*/
inline string *pobierzchorobe(string pesel1, string nazwac)
{
    if(!polaczzbaza(mysql))
    {
        return NULL;

    }
    int ret;

    string z = "select c.nazwa, c.poczatek, c.leczenie, c.koniec, c.gdzie_leczyl from choroba c where c.nazwa ='"+nazwac+"' and c.peselc = '"+ pesel1 +"';";

    ret = mysql_query(mysql, z.c_str());
    if (ret != 0)
    {
        //MessageBox(NULL,mysql_error(mysql),":>",MB_OK);
        SetWindowText(hStaticField, mysql_error(mysql));
    }
    else
    {
        SetWindowText(hStaticField, "Pobrano opis choroby z bazy danych.");
        res = mysql_store_result(mysql);
        if (res)
        {

            MYSQL_ROW row;
            int liczba = mysql_num_fields(res);
            while(row = mysql_fetch_row(res))
            {
                for( int i = 0; i < liczba; i++)
                {
                    tablica_choroba[i] = row[i];
                }
            }
        }
    }
    mysql_close(mysql);
    return tablica_choroba;
}

inline bool dodajchor(string peseld, string id, string nazwad, string poczatek, string leczenie, string koniec, string gdzie_leczyl)
{
    bool result = false;
    if(!polaczzbaza(mysql))
    {
        return result;
    }
    int ret;

    string u = "insert into choroba(id,nazwa,poczatek,leczenie,koniec,peselc,gdzie_leczyl) values ('" + id + "','" + nazwad + "','" + poczatek + "','" + leczenie + "','" + koniec + "','" + peseld + "','" + gdzie_leczyl + "');";

    ret = mysql_query(mysql, u.c_str());
    if (ret != 0) {
        //MessageBox(NULL,mysql_error(mysql),":>",MB_OK);
        SetWindowText(hStaticField, mysql_error(mysql));
        result = false;
    }
    else {
        //MessageBox(NULL,"DODANO",":>",MB_OK);
        SetWindowText(hStaticField, "Dodano chorobe do bazy danych.");
        result = true;
    }

    mysql_close(mysql);
    return result;
}

inline bool dodajpac(string imie,string nazwisko,string peselp,string adres,string uwagi,string alergie,string przewlekle,string przebyte,string obecnie)
{
    bool result = false;
    if(!polaczzbaza(mysql))
    {
        return result;
    }
    int ret;

    string u = "insert into pacjent(imie, nazwisko, pesel, adres, uwagi, alergie, przewlekle, przebyte, obecnie) values ('" + imie + "','" + nazwisko + "','" + peselp + "','" + adres + "','"+ uwagi + "','" + alergie + "','" + przewlekle + "','" + przebyte + "','" + obecnie +"');";

    ret = mysql_query(mysql, u.c_str());
    if (ret != 0) {
        //MessageBox(NULL,mysql_error(mysql),"ERROR",MB_OK);
        SetWindowText(hStaticField, mysql_error(mysql));
        result = false;
    }
    else {
        //MessageBox(NULL,"DODANO",":>",MB_OK);
        SetWindowText(hStaticField, "Dodano pacjenta do bazy danych.");
        result = true;
    }

    mysql_close(mysql);
    return result;
}
/*
inline bool dodajdate(string id, string peselw, string nowa, string pierwsza, string druga, string trzecia, string czwarta, string piata, string szosta, string siodma, string osma, string dziewiata, string dziesiata)
{
    bool result = false;
    if(!polaczzbaza(mysql))
    {
        return result;
    }
    int ret;

    string u = "insert into wizyty(id, peselw, pierwsza, druga, trzecia, czwarta, piata, szosta, siodma, osma, dziewiata, dziesiata) values ('"
             + id + "','" + peselw + "','" + nowa + "','" + pierwsza +"','" + druga + "','"+ trzecia + "','" + czwarta + "','" + piata
             + "','" + szosta +"','" + siodma +"','" + osma +"','" + dziewiata +"','" + dziesiata +"');";

    ret = mysql_query(mysql, u.c_str());
    if (ret != 0) {
        MessageBox(NULL,mysql_error(mysql),"ERROR",MB_OK);
        result = false;
    }
    else {
        MessageBox(NULL,"DODANO",":>",MB_OK);
        result = true;
    }

    mysql_close(mysql);
    return result;
}
*/
inline bool updpac(string imie,string nazwisko,string pesels,string adres,string uwagi,string alergie,string przewlekle,string przebyte,string obecnie, string peselw)
{
    bool result;
    if(!polaczzbaza(mysql))
    {
        return result;
    }
    int ret;

    string u = "update pacjent p SET p.imie = '"+imie+"',  p.nazwisko = '"+nazwisko+"' , p.pesel ='"+pesels+"', p.adres ='"+adres+"' , p.uwagi='"+uwagi+"', p.alergie='"+alergie+"', p.przewlekle = '"+przewlekle+"', p.przebyte = '"+przebyte+"', p.obecnie = '"+obecnie+"' WHERE p.pesel='"+peselw+"';";

    ret = mysql_query(mysql, u.c_str());
    if (ret != 0) {
        //MessageBox(NULL,mysql_error(mysql),"ERROR",MB_OK);
        SetWindowText(hStaticField, mysql_error(mysql));
        result = false;
    }
    else {
        //MessageBox(NULL,"DODANO",":>",MB_OK);
        SetWindowText(hStaticField, "Zaktualizowano pacjenta w bazie danych.");
        result = true;
    }

    mysql_close(mysql);
    return result;
}

inline bool updcho(string id,string nazwa,string poczatek,string leczenie,string koniec,string peselc,string gdzie_leczyl,string nazwaw ,string peselw)
{
    bool result = false;
    if(!polaczzbaza(mysql))
    {
        return result;
    }
    int ret;

    string u = "update choroba c SET c.nazwa='"+nazwa+"' , c.poczatek='"+poczatek+"',c.leczenie='"+leczenie+"',c.koniec='"+koniec+"', c.peselc='"+peselc+"',c.gdzie_leczyl='"+gdzie_leczyl+"' WHERE c.nazwa ='"+nazwaw+"' and c.peselc='"+peselw+"';";

    ret = mysql_query(mysql, u.c_str());
    if (ret != 0) {
        //MessageBox(NULL,mysql_error(mysql),"ERROR",MB_OK);
        SetWindowText(hStaticField, mysql_error(mysql));
        result = false;
    }
    else {
        //MessageBox(NULL,"DODANO",":>",MB_OK);
        SetWindowText(hStaticField, "Zaktualizowano chorobe w bazie danych.");
        result = true;
    }

    mysql_close(mysql);
    return result;
}

inline string *maxidchoroby()
{
    if(!polaczzbaza(mysql))
    {
        return NULL;

    }
    int ret;

    string u = "select MAX(c.id) from choroba c;";

    ret = mysql_query(mysql, u.c_str());
    if (ret != 0)
        MessageBox(NULL,mysql_error(mysql),":>",MB_OK);
    else
    {
        res = mysql_store_result(mysql);
        if (res)
        {

            MYSQL_ROW row;
            int liczba = mysql_num_fields(res);
            while(row = mysql_fetch_row(res))
            {
                for( int i = 0; i < liczba; i++)
                {
                    idchor[i] = row[i];
                }
            }
        }
    }
    mysql_close(mysql);
    return idchor;
}
/*
inline bool upddat(string peselw,string  pierwsza,string  druga,string  trzecia,string  czwarta,string  piata,string  szosta,string  siodma,string  osma,string  dziewiata,string  dziesiata,string  peself)
{
    bool result = false;
    if(!polaczzbaza(mysql))
    {
        return result;
    }
    int ret;

    string u = "update wizyty w SET  w.peselw = '"+peselw+"', w.pierwsza = '"+pierwsza+"', w.druga = '"+druga+"', w.trzecia = '"+trzecia+"', w.czwarta = '"+czwarta+"', w.piata = '"+piata+"', w.szosta = '"+szosta+"', w.siodma = '"+siodma+"', w.osma = '"+osma+"', w.dziewiata = '"+dziewiata+"', w.dziesiata = '"+dziesiata+"' where w.peselw = '"+peself+"';";

    ret = mysql_query(mysql, u.c_str());
    if (ret != 0) {
        MessageBox(NULL,mysql_error(mysql),"ERROR",MB_OK);
        result = false;
    }
    else {
        MessageBox(NULL,"DODANO",":>",MB_OK);
        result = true;
    }

    mysql_close(mysql);
    return result;
}
*/
#endif
